/**
 * Copyright(c) 2014 Xunton Solutions
 *
 * History:
 *   15-1-14 上午10:16 Created by dwzhang
 */
package com.jade.modules.config;

import java.util.List;

import com.jade.framework.base.context.ApplicationContextUtils;
import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;
import com.jade.framework.base.util.Parameters;

/**
 * 配置项管理工具类。
 *
 * @author <a href="mailto:dwzhang@xunton.com">dwzhang</a> 
 * @version 1.0 15-1-14 上午10:16
 */
public class ConfigUtils
{
    protected static ConfigManager configManager;

    public static ConfigManager getConfigManager()
    {
        if (configManager == null) {
            configManager = ApplicationContextUtils.getBean("module_configManager");
        }
        return configManager;
    }

    /**
     * 获取配置参数。
     *
     * @param ownerType 所有者类型
     * @param ownerId   所有者标识
     * @param group      配置项组
     * @return 配置。
     */
    public static Parameters getConfig(String ownerType, String ownerId, String group)
    {
        return getConfigManager().getConfig(ownerType, ownerId, group);
    }

    /**
     * 获取配置项实体对象列表。
     *
     * @param ownerType 所有者类型
     * @param ownerId   所有者标识
     * @param group      配置项组
     * @return 配置项实体对象列表
     */
    public static List<ConfigEntity> listEntity(String ownerType, String ownerId, String group)
    {
        return getConfigManager().listEntity(ownerType, ownerId, group);
    }

    /**
     * 查询一个所有者的配置项。
     *
     * @param ownerType 所有者类型
     * @param ownerId   所有者标识
     * @param criteria 查询条件
     * @return 配置项列表
     */
    public static PagingList<ConfigEntity> queryEntity(String ownerType, String ownerId, Criteria criteria)
    {
        return getConfigManager().queryEntity(ownerType, ownerId, criteria);
    }

    /**
     * 添加一个新的配置项。
     *
     * @param entity 配置项实体对象
     */
    public static void addEntity(ConfigEntity entity)
            throws ConfigException
    {
        getConfigManager().addEntity(entity);
    }

    /**
     * 更改配置项。
     *
     * @param entity 配置项实体对象
     */
    public static void updateEntity(ConfigEntity entity)
            throws ConfigException
    {
        getConfigManager().updateEntity(entity);
    }

    /**
     * 设置一种类型的配置项。
     *
     * @param ownerType 所有者类型
     * @param ownerId   所有者标识
     * @param group      配置项组
     * @param entities 配置项实体列表。
     */
    public static void setEntity(String ownerType, String ownerId, String group, List<ConfigEntity> entities)
            throws ConfigException
    {
        getConfigManager().setEntity(ownerType, ownerId, group, entities);
    }

    /**
     * 删除指定的配置项。
     *
     * @param ids 配置项实体标签
     */
    public static void removeEntity(long... ids)
            throws ConfigException
    {
        getConfigManager().removeEntity(ids);
    }

    /**
     * 根据标识获取配置项。
     *
     * @param id 配置项标识
     * @return 配置项
     */
    public static ConfigEntity getEntity(long id)
    {
        return getConfigManager().getEntity(id);
    }

    /**
     * 根据key获取配置项。
     *
     * @param ownerType 所有者类型
     * @param ownerId   所有者标识
     * @param group 配置组
     * @param key 配置项key值
     * @return 配置项
     */
    public static ConfigEntity getEntity(String ownerType, String ownerId, String group, String key)
    {
        return getConfigManager().getEntity(ownerType, ownerId, group, key);
    }

    /**
     * 列出一个所有者的所有配置组。
     *
     * @param ownerType 所有者类型
     * @param ownerId   所有者标识
     * @return 配置组列表
     */
    public static List<ConfigGroupEntity> listGroup(String ownerType, String ownerId)
    {
        return getConfigManager().listGroup(ownerType, ownerId);
    }

    /**
     * 获取配置组信息。
     *
     * @param id 配置组
     * @return 配置组对象
     */
    public static ConfigGroupEntity getGroup(long id)
    {
        return getConfigManager().getGroup(id);
    }

    /**
     * 根据key来获取配置组信息。
     *
     * @param ownerType 所有者类型
     * @param ownerId   所有者标识
     * @param key 配置组key值
     * @return 配置组对象。
     */
    public static ConfigGroupEntity getGroup(String ownerType, String ownerId, String key)
    {
        return getConfigManager().getGroup(ownerType, ownerId, key);
    }

    /**
     * 根据key和value创建配置项。主要针对那些不需要直接显示的配置项。
     *
     * @param key 配置项key值
     * @param value 配置项值
     * @return 配置项实体对象
     */
    public static ConfigEntity createEntity(String key, String value)
    {
        ConfigEntity entity = new ConfigEntity();
        entity.setKey(key);
        entity.setValue(value);
        return entity;
    }

    /**
     * 分组数据分页查询
     * @param ownerType
     * @param ownerId
     * @param criteria
     * @return
     */
    public static PagingList<ConfigGroupEntity> queryGroup(String ownerType,String ownerId,Criteria criteria)
    {
        return getConfigManager().queryGroup(ownerType,ownerId,criteria);
    }

    /**
     * 新增分组
     * @param groupEntity
     * @throws ConfigException
     */
    public static void addGroup(ConfigGroupEntity groupEntity) throws ConfigException
    {
        getConfigManager().addGroup(groupEntity);
    }

    /**
     * 编辑分组
     * @param groupEntity
     * @throws ConfigException
     */
    public static void updateGroup(ConfigGroupEntity groupEntity) throws ConfigException
    {
        getConfigManager().updateGroup(groupEntity);
    }

    /**
     * 删除分组
     * @param ids
     * @throws ConfigException
     */
    public static void removeGroup(long... ids) throws ConfigException
    {
        getConfigManager().removeGroup(ids);
    }
}
